import { ref, watchEffect } from "vue";

export const useUniversalStorage = <T>(key: string, defaultValue: T) => {
	const value = ref<T>(defaultValue);

	// 读取初始值
	const readValue = () => {
		try {
			// 优先使用 uni Storage
			const uniValue = uni.getStorageSync(key);
			if (uniValue !== "") {
				return typeof defaultValue === "object"
					? JSON.parse(uniValue)
					: uniValue;
			}

			// App 环境检查原生存储
			if (typeof plus !== "undefined") {
				const plusValue = plus.storage.getItem(key);
				if (plusValue) {
					return typeof defaultValue === "object"
						? JSON.parse(plusValue)
						: plusValue;
				}
			}

			return defaultValue;
		} catch (error) {
			console.warn(`读取存储 ${key} 失败:`, error);
			return defaultValue;
		}
	};

	// 设置值
	const setValue = (newValue: T) => {
		try {
			const valueToStore =
				typeof newValue === "object"
					? JSON.stringify(newValue)
					: String(newValue);

			// 同时设置 uni 和 plus 存储
			uni.setStorageSync(key, valueToStore);

			if (typeof plus !== "undefined") {
				plus.storage.setItem(key, valueToStore);
			}

			value.value = newValue;
		} catch (error) {
			console.error(`设置存储 ${key} 失败:`, error);
		}
	};

	// 初始化
	value.value = readValue();

	// 响应式更新
	watchEffect(() => {
		if (value.value !== undefined) {
			setValue(value.value);
		}
	});

	return value;
};
export default {
	useUniversalStorage,
};
